Шаг 54 - Подробнее о событиях загрузки и выгрузки формы

Форма в VBA это каркас приложения. Как добавлять форму в Ваш проект смотрите "Шаг 15 - Пользовательские формы". В основном события формы по ее инициализации и деинициализации разворачиваются в таком порядке:

Initialize
Load
Activate
Deactivate
QueryUnload
Unload
Terminate

Но форма в VBA и VB различаются. Давайте сравним:

VBA VB
UserForm_Initialize() Form_Initialize()
Нет Form_Load()
UserForm_Activate() Form_Activate()
UserForm_Deactivate() Form_Deactivate()
UserForm_QueryClose(Cancel As Integer,CloseMode As Integer) Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
нет Form_Unload(Cancel As Integer)
UserForm_Terminate() Form_Terminate()

Получается, что событие Load и Unload в VBA не обрабатываются.

Событие Initialize

Событие Initialize (Инициализация) обычно используется для подготовки к работе приложения или формы UserForm. Переменным присваиваются исходные значения, а положение или размеры элементов управления могут быть изменены для согласования с данными, заданными при инициализации. Это событие появляется до загрузки формы и ее отображения. Это событие появляется во время загрузки формы. Давайте в него напишем код:

Private Sub UserForm_Initialize()
MsgBox "UserForm_Initialize"
End Sub

А теперь две функции, которые вызывают Load:

Sub Test()
	Load UserForm1
	Call Test2
End Sub

Sub Test2()
	Unload UserForm1
	Load UserForm1
End Sub

В результате окно с информацией о инициализации будет на экране два раза. Так же это событие сгенерирует событие Show, так как первый раз для работы с формой ее нужно загрузить. Еще это событие может быть вызвано, если в форме определена функция общего назначения. Вызов этой функции опять приводит к загрузке формы.

Private Sub UserForm_Terminate()

End Sub

Public Sub MyMessage()
	MsgBox "MyMessage"
End Sub

А вот так можно вызвать:

Sub Test()
	UserForm1.MyMessage
End Sub

Итак, событие Intialize вызывается только один раз для формы перед ее загрузкой.

Событие Load

Нет ее в VBA, а вообще в VB здесь можно что-то сделать перед выводом формы на экран.

Событие Activate и Deactivate

Событие Activate происходит, когда объект становится активным окном. А становится активным окном он может в двух случаях. Это в результате Show, когда форма становится видимой на экране и в результате получения фокуса. Событие Deactivate (Деактивизация) происходит, когда объект более не является активным окном. Эти события генерируются только при переключении между окнами одного приложения. Если вы перейдете в другую программу и вернетесь в Excel, то эти события не будут сгенерированы.

Событие QueryClose

Это событие генерируется для того, чтобы получить у пользователя разрешение на закрытие формы. В зависимости от кода возврата форма закрывается или нет.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
	If CloseMode <> 1 Then Cancel = 1
		UserForm1.Caption = "Close не будет работать. Выберите меня!"
	End IF	
End Sub

Событие Unload

Нет его, точно так же как и Load, а вообще используется, если надо что-либо делать при выгрузке формы, например сохранить настройки пользователя.

Событие Terminate

Данное событие происходит, когда все ссылки на экземпляр объекта удаляются из памяти с помощью присвоения всем переменным, которые ссылаются на данный объект, состояния Nothing или когда последняя ссылка на объект выходит за пределы области определения. Это событие идет вслед за Unload.

Hosted by uCoz